package yao.config;

import java.util.ArrayList;
import java.util.List;

import yao.config.exception.ConfigException;
import yao.config.exception.NodeNotFoundException;


/**
 * 存储对象
 * 
 * @author YaoMing
 */
final class Storage {

	/** 节点集合 */
	NodeMap nodeMap;

	/** 用户修改的配置集合 */
	NodeMap updateMap;

	Storage() {
		nodeMap = new NodeMap();
		updateMap = new NodeMap();
	}

	/**
	 * 取得NodeList
	 * 
	 * @param name
	 * @return
	 */
	List<Node> getNodeList(String name) {
		if (name.equals("*")) {
			return nodeMap.getNodes();
		} else if (name.equals("") || name.equals("/")) {
			List<Node> nodes = new ArrayList<Node>();
			for (Node node : nodeMap.getNodes()) {
				if (node.getName().indexOf(".") == -1) {
					nodes.add(node);
				}
			}
			return nodes;
		}
		return getNode(name).nodeMap.getNodes();
	}

	/**
	 * 通过name，拿到节点
	 * 
	 * @param name
	 * @return
	 */
	Node getNode(String name) {
		Node node = nodeMap.get(name);
		if (node == null) {
			throw new NodeNotFoundException("Node name: " + name);
		}
		return node;
	}

	/**
	 * 设置新值,修改配置
	 * 
	 * @param name
	 * @param value
	 * @throws ConfigException
	 */
	void setValue(String name, String value) throws ConfigException {
		if (!getNode(name).isWriteable()) {
			throw new ConfigException("The node \"" + name + "\" is not writeable");
		}
		Node n = updateMap.get(name);
		if (null == n) {
			n = new Node();
			n.configPath.addAll(getNode(name).configPath);
			updateMap.put(name, n);
		}
		n.value = new Value(value);
	}
}
